
/*
*Pool Public Licence version 0.1 or later
*Released on 20th April 2008.
*Any voilations can be repoted at paritosh@wikiocean.net
*What is treated as voilations can be found at www.wikiocean.net/ppl1-voilations* 
******************************************************************************
* The contents of this file are subject Affero GPL v3 and later with additional conditions.
* The additional conditions are to be considered as part of the Affero GPL v3 and later.
* The additional conditions will supersede the Affero GPLv3 and later in case of conflict.
* ("License"); You may not use this file except in compliance with the License
* You may obtain a copy of the License at http://www.gnu.org/licenses/agpl.html
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
* The Initial Developer of the Original Code is Paritosh Pungaliya.
* created by Paritosh Pungaliya are Copyright (C) Paritosh Pungaliya; All Rights Reserved.
* Contributions are Copyright (C) 2001-2008 Paritosh Pungaliya.

* Objective of the additional terms (license) 
* 1) Is to extend the software freedom to freedom to work.
* 2) To ensure that knowledge is free from monopoly of agencie(s).
* 3) To avoid a situation where big corporates or investors can buy out free software groups and companies and then start milking the communities built around it.
* (this trend can be seen how the openness changes in companies that get Venture Capital funding.)
* (if you agree to this logic I invite you to our group to work together)

* Additional conditions
*  0) Source code will also include
* 	a) data dictionaries, data ontologies which are used to alter the behavior of code or to control           the features of application.
* 	b) Any code generated or derived automatically or manually from this code or logic
*  1) The revenue generated by deploying, implementing , selling services and other activities
*  	 based on this source code should be shared 100%, between the people working on it.
*  2) Capital invested should be given only fixed rate of return or linked to revenue/surplus growth for limited time.
*  3) People working on the project should always have an option to replace the capital provider in full or part with lower cost capital.
*  4) Their should not be any ownership which can be sold as a claim on future profit to be generated from the work of people working on the code.
*  5) Brand thus generated should belong to the group.
*  6) For old and new members revenue sharing should be equal for same work equivalent.
*  7) The share of revenue should be decided by bidding for work before allocation of work within the group.
*  8) Before bidding various method of measuring the work should be clearly defined and published in public domain. Any change in process should also be publised in public domain imediately.
*  9) All data related to to revenue sharing should be published as and when generated in public domain.
*  10) For group of people having size more than 10 people will have to make it open online for others to participate in bids. 
*  11) All people involved in related and sub project will be treated as a group.
*  12) Once this license is being used for a certain code then all and any other software services being provided by the group should complusorilly come under 100% revenue sharing.
*  13) Cross subsidization should not happen under this revenue share, no additional benefit should be drawn from the people, by the employing agency.
*  14) Any position or knowledge or legal structure created relating to people working on code, which adversely affects the spirit of 100% revenue share will be treated as a violation.
*  15) Revenue sharing defined.
*     a) includes direct revenue and also intangible gains like brand, and organization.
*     b) No personal judgment should be involved in judging the distribution of revenue.It has to be pre-defined formula based.
*     c)100% of revenue should be shared before expenses and recievers should have control over what expenses to incur.
*     d)For the work done in any month by contributing group member, working on any project can be given revenue share from the work done by the group, for a maximum of 18 months after that month.
*     e)Revenue should be apportioned to the month in which work is done and not when received.
*  The group fulfilling the above conditions also has to be a wiki ecosystem further defined in www.wekosystem.org or read about Wekosystem at www.wikiocean.net

*  ******************************************************************************
*/  
package rate;

import java.sql.ResultSet;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;

//import file.SearchRecord;
import timer.ExecutionTimer;
import timer.TimerRecordFile;
import utility.ConvertToLower;
import database.RecordSearch;
import dbmanager.Column;
import dbmanager.DBManager;
import dbmanager.GetIdName;

public class RateDetails implements Rate
{
	//String BasicPath = "C://Reports//Basic_Reports//Master_Reports//";
	//String fileFormat = ".txt";
	
	public double TDAmount;
	Hashtable<Object,Object> TransactionDetailMap = new Hashtable<Object,Object>();
	Hashtable<Object,Object> ConditionRateDetailMap = new Hashtable<Object,Object>();
	
	DBManager dbSQL;
	String Username;
	
	String Rate = "Rate";
	String Item = "item";
	String Unit = "uom";
	String Qty = "qty";
	String Buysell = "Buysell";
	String Group = "Usergroup";
	String uom = "gm";
	String packsize = "packsize";
	String delivery_date;
	
	String rate;
	String ItemCode;
	String BuyerSeller;
	String group;
	String BUYER = "buyer";
	String SELLER = "seller";
	String BuySellRate;
	
	GetIdName gin;
	RateDetails()
	{
	}
	public RateDetails(DBManager dbSQL, String Username)
	{
		
		 ExecutionTimer t = new ExecutionTimer();
		 t.start();
		this.dbSQL = dbSQL;
		this.Username = Username;
		gin = new GetIdName(dbSQL);
		t.end();
		TimerRecordFile timerFile=new TimerRecordFile("rate","RateDetails","RateDetails",t.duration());
	}
	@SuppressWarnings("unused")
	public void Input(Hashtable<Object, Object> TDMap,Hashtable<Object, Object> TransactionMap) 
	{
		 ExecutionTimer t = new ExecutionTimer();
		 t.start();
		TransactionDetailMap.putAll(ConvertToLower.convertHashKey(TDMap));
		TransactionMap = ConvertToLower.convertHashKey(TransactionMap);
		String buysell = "no$";
		String order_date;
		
		try 
		{
			//GET PACK SIZE
			if(TransactionDetailMap.containsKey(packsize))
			{
				String temp1 ;
				temp1 = TransactionDetailMap.get(packsize).toString();
				TransactionDetailMap.remove(packsize);
				packsize = TransactionDetailMap.get(Qty).toString();
				packsize = String.valueOf((Double.valueOf(packsize)*Double.valueOf(temp1)));
				ConditionRateDetailMap.put(Qty, packsize);
			}
			else
			{
				packsize = TransactionDetailMap.get(Qty).toString();
				ConditionRateDetailMap.put(Qty, packsize);
			}
			String trans_type = gin.getItem(TransactionMap.get("transaction_type").toString());
			
			//GET TRANSACTION_TYPE
			if(trans_type.toLowerCase().equals("po"))
			{
				buysell = gin.getId("sell");
				BuyerSeller = "buyer";
				if(TransactionMap.containsKey(BUYER)==false)
				{
					Username = gin.getId(Username);
				}
				else
					Username = TransactionMap.get(BUYER).toString();
				BuySellRate = "buyrate";
			}
			else if(trans_type.toLowerCase().equals("so"))
			{
				buysell = gin.getId("buy");
				BuyerSeller = "seller";
				if(TransactionMap.containsKey(SELLER)==false)
				{
					Username = gin.getId(Username);
				}
				else
					Username = TransactionMap.get(SELLER).toString();
				BuySellRate = "sellrate";
			}
			//GET DELIVERY DATE
			if(TransactionMap.containsKey("delivery_date"))
				delivery_date = TransactionMap.get("delivery_date").toString()+" 00:00:00";
			else
			{
				String pattern = "yyyy-MM-dd HH:MM:ss";
				SimpleDateFormat sdm = new SimpleDateFormat(pattern);
				delivery_date = sdm.format(new Date());
			}
				
			
		}
		catch (Exception e) 
		{
			e.printStackTrace();
		}
		BuyerSeller = gin.getId(BuyerSeller);
		try 
		{
			//GET USERGROUP
			
			String GROUPId = gin.getId(Group);
			String path = utility.Input.MASTERREPORTSPATH+Username+"//"+Username+"_mid"+utility.Input.FILRFORMAT;
			
			Hashtable<Object , Object> hasht = new Hashtable<Object, Object>();
			hasht.put("pid", GROUPId);
			hasht.put("Ref", buysell);
			hasht.put("mid", Username);
			//RandomAccessFile raf = new RandomAccessFile(path,"r");
			//FileUtility fu = new FileUtility(raf);
			int Index_PV = Column.pv_index-1;
			//raf.close();
			/*SearchRecord sr = new SearchRecord(path);
			sr.fileOpen();
			String line [] = sr.getRecordSet(hasht);
			sr.fileClose();*/
			hasht.put("td","null");
			RecordSearch ps = new RecordSearch(dbSQL);
			ps.setConditionMap(hasht);
			String line [] = ps.getArrayFromResultSet();
			line = line[0].split("\t");
			group = line[Index_PV];
		}
		catch (Exception e) 
		{
			e.printStackTrace();
			group = gin.getId("DG1");
		}
		
		try
		{
			ConditionRateDetailMap.put(Item, TransactionDetailMap.get(Item).toString());
			ConditionRateDetailMap.put(Buysell, buysell);
			ConditionRateDetailMap.put(Group, group);
			//ConditionRateDetailMap.put(Unit, TransactionDetailMap.get(Unit).toString());
		}
		catch (Exception e) 
		{
			e.printStackTrace();
		}
		//String[] RateDetailList = {"Item","Quntity","Unit","Group1","BuySell","Order_date","Delivery_date"};
		t.end();
		TimerRecordFile timerFile=new TimerRecordFile("rate","RateDetails","Input",t.duration());
	}
	public Hashtable<Object, Object> Output() 
	{
		 ExecutionTimer t = new ExecutionTimer();
		 t.start();
		String lastValue = getRate(ConditionRateDetailMap);
		double tempvalue =Double.parseDouble(lastValue);
		DecimalFormat de = new DecimalFormat("0.00");
		lastValue = de.format(tempvalue);
		TransactionDetailMap.put("Rate",lastValue);
		
		try 
		{
	//		Check for Sell Or Buy
			String buysell = gin.getItem(ConditionRateDetailMap.get(Buysell).toString());
			if(buysell.equals("buy"))
			{
				ConditionRateDetailMap.put(Buysell, gin.getId("sell"));
			}
			else if(buysell.equals("sell"))
				ConditionRateDetailMap.put(Buysell, gin.getId("buy"));
			
			//get Selling OR Purchase Rate
			
			lastValue = getRate(ConditionRateDetailMap);
			tempvalue =Double.parseDouble(lastValue);
			lastValue = de.format(tempvalue);
			TransactionDetailMap.put(BuySellRate,lastValue);
		}
		catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		t.end();
		TimerRecordFile timerFile=new TimerRecordFile("rate","RateDetails","Output",t.duration());
		return TransactionDetailMap;
	}
	
	public void Input(Hashtable<Object, Object> hashMap)
	{
		// TODO Auto-generated method stub
	}
	public void setUser(String Username) {
		// TODO Auto-generated method stub
		
	}
	
	public String getRate(Hashtable<Object,Object> ipt)
	{
		 ExecutionTimer t = new ExecutionTimer();
		 t.start();
		UnitConversion uc = new UnitConversion ();			// make object of Unitconversion class to invoke the methods of Unitconversion class
		double qntOfOrder;
		double ratePerUnit = 0;
		String unitOfOrder="";
		String unitOfMaster="gm";
		
		System.out.println ("Ordered Item : "+ipt);
		System.out.println();
		
		HashMap<Object,Object> fromMaster = new HashMap<Object, Object>();			// HashMap fromMaster to hold the rate_master records
		try
		{		
			//CHECKING DATE
			ResultSet rs = dbSQL.getSelect("Select * from rate_master where Item='"+ipt.get("item")+"' AND BuySell='"+ipt.get("Buysell")+"' AND Usergroup='"+ipt.get(Group)+"' AND FD<='"+delivery_date+"'");
			
			while (rs.next())
			{					// cursor
//				Check for TD is 0000-00-00 00:00:00
				String date = rs.getString("TD");
				String pattern = "yyyy-MM-dd hh:mm:ss";
				SimpleDateFormat sdm = new SimpleDateFormat(pattern);
				String tempTodayDate = sdm.format(new Date());
				Date todayDate = (Date)sdm.parse(tempTodayDate);
				Date delDate = (Date)sdm.parse(date);
				if(delDate.compareTo(todayDate)>=0||date.equals("0000-00-00 00:00:00"))
				{
					for (int i=1; i<=rs.getMetaData().getColumnCount(); i++)
					{
						fromMaster.put( rs.getMetaData().getColumnName(i) , rs.getString(i));
					}							// for loop closed
				}
				else
					return "0";
				
			}							// rs.....next is closed while closed
		}									// close try
		catch(Exception e)
		{	
			//catch the exception
			System.out.println("Item Rate is not Available detail from master : ");
			return "0";
		}							

		System.out.println("Item's detail from master : "+fromMaster);
			
		if(fromMaster.isEmpty())
			return "0";
		try
		{
			unitOfMaster = (String) fromMaster.get("Unit");
		}
		catch (Exception e) 
		{
			e.printStackTrace();
		}
		try
		{
			qntOfOrder = Double.parseDouble(ipt.get("qty").toString());
		
			unitOfOrder = (String) ipt.get("uom");
			System.out.print("Quantity of order : "+ qntOfOrder+" ");
			System.out.println(unitOfOrder);
		}
		catch (Exception e) 
		{
			e.printStackTrace();
		}

		try
		{
			String rp = (String) fromMaster.get("Rate");
			System.out.println(rp);
		
			ratePerUnit = Double.parseDouble(rp);
			System.out.println (ratePerUnit);
		}
		catch (Exception e) 
		{
			e.printStackTrace();
		}
													//main if closed
		t.end();
		TimerRecordFile timerFile=new TimerRecordFile("rate","RateDetails","getRate",t.duration());
		return Double.toString(ratePerUnit);
	}
}
